package main

import (
  "context"
  "fmt"
  redis "github.com/go-redis/redis/v8"
)
/*
问题：
1、使用 redis benchmark 工具, 测试 10 20 50 100 200 1k 5k 字节 value 大小，redis get set 性能。
2、写入一定量的 kv 数据, 根据数据大小 1w-50w 自己评估, 结合写入前后的 info memory 信息  , 
分析上述不同 value 大小下，平均每个 key 的占用内存空间。

以上作业，要求提交到自己的 GitHub 上面，然后把自己的 GitHub 地址填写到班班提供的表单中：
 https://jinshuju.net/f/C0huuc
*/



/*
question2
在 1w key 的情况下, 每个 key,平均占用 55.112 byte
在 2w key 的情况下, 每个 key,平均占用 62.116 byte
在 3w key 的情况下, 每个 key,平均占用 60.070 byte
在 4w key 的情况下, 每个 key,平均占用 65 byte

*/


func main(){
  var ctx = context.Background()

  rdb := redis.NewClient(&redis.Options{
    Addr:     "127.0.0.1:6379",
    Password: "", // no password set
    DB:       0,  // use default DB
  })
  const n = 10000
  i:= 1
  rdb.FlushAll(ctx)
  setKey(ctx, rdb, n*i)
  fmt.Printf("execute %d times SET,  memory: %s", n*i, rdb.Info(ctx, "memory"))
}

func setKey(ctx context.Context, rdb *redis.Client, keyCount int ) {
  for i := 0; i < keyCount; i++ {
    //case1 : 不同 key,相同 value,会触发 redis 的 shared object
    //case2 : 不同 key,不同 value,memory 正常增长
    err := rdb.Set(ctx, fmt.Sprintf("key_%d", i), i, 0).Err()
    if err != nil{
      fmt.Errorf("setKey error: %s", err)
    }
  }

}